home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Euroscene 1
/
Euroscene 1.iso
/
resource
/
pchglib_11.lha
/
PCHGLib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-26
|
3KB
|
111 lines
#include <exec/types.h>
#include <iff/pchg.h>
#include <clib/pchglib_protos.h>
/****** pchg.lib/--background-- ******************************************
The purpose of this library is to give programmers an easy way to
implement PCHG display technology in their programs. The library
allows to read and write easily PCHG chunks by providing
compression/decompression routines and CopperList building
functions.
When reading PCHG chunks, you have three function you can use:
PCHG_ParsePCHG() will automagically parse the chunk (possibly using
decompression) and build the Copperlist for your ViewPort. If you're
using the ViewPort of an Intuition Screen, when you will call
CloseScreen() the Copperlist will be automatically deallocated.
Otherwise, you can use PCHG_SetUserCopList(), which gives you a finer
control (for instance, you can build a Copperlist with an offset).
However, the chunk parsing is left to you, apart from the
decompression, which is handled by PCHG_FastDecomp(). This routine
is called with register parameter passing, so if you're not using
SAS C or Assembly, you'd better call PCHG_CFastDecomp(), which has
standard parameter passing.
When writing a PCHG chunk, the function PCHG_CompHuffmann() will
pack with static Huffmann encoding your LINEDATA (i.e., the line mask
followed by a SmallLineChanges or BigLineChanges array, as from
the PCHG specification).
Finally, the function PCHG_SHAM2PCHG() will build a fake PCHG chunk from
a SHAM chunk, making easy for people to partially support the old
"standard".
There are two versions of this library: pchg.lib has stack parameter
passing, while pchgr.lib was compiled with the SAS/C -rr (registerized
parameter passing) option.
The prototypes for pchg.lib can be found in clib/pchglib_protos.h, while
the general PCHG include file is iff/pchg.h.
This library was written by Sebastiano Vigna, and it's placed in
the public domain.
*************************************************************************/
#if INCLUDE_VERSION<36
FAILURE!! Amiga includes version<36
#endif
/* The following structures are used by pchg.lib, and shouldn't be used by
any other program. */
struct TreeInternalNode {
struct TreeNode *Left;
struct TreeNode *Right;
};
struct TreeExternalNode {
ULONG CodeLength;
ULONG Code;
};
struct TreeNode {
struct TreeNode *Parent;
UWORD IsExternal;
UWORD IsRight;
union {
struct TreeInternalNode Int;
struct TreeExternalNode Ext;
} n;
};
/* This routine is here for historical interest. Is a C version of
PCHG_FastDecomp(). */
VOID PCHG_Decompress(ULONG *Source, UBYTE *Dest, WORD *Tree, ULONG OriginalSize) {
ULONG i = 0, bits = 0;
ULONG CurLongword;
SHORT *p = Tree;
while(i<OriginalSize) {
if (!bits) {
CurLongword = *(Source++);
bits = 32;
}
if (CurLongword & 0x80000000) {
if (*p>=0) {
*(Dest++) = (unsigned char)*p;
i++;
p = Tree;
}
else p+=(*p/2);
}
else {
p--;
if (*p>0 && (*p & 0x100)) {
*(Dest++) = (unsigned char)*p;
i++;
p = Tree;
}
}
CurLongword <<= 1;
bits--;
}
}